package search;

import java.util.*;

/**
 * @description: 字符串查找排序，涉及到Comparator比较器的使用
 * 请设计一个高效算法，再给定的字符串数组中，找到包含"Coder"的字符串(不区分大小写)，并将其作为一个新的数组返回。结果字符串的顺序按照"Coder"出现的次数递减排列，若两个串中"Coder"出现的次数相同，则保持他们在原数组中的位置关系。
 * 给定一个字符串数组A和它的大小n，请返回结果数组。保证原数组大小小于等于300,其中每个串的长度小于等于200。同时保证一定存在包含coder的字符串。
 * 测试样例：
 * ["i am a coder","Coder Coder","Code"],3
 * 返回：["Coder Coder","i am a coder"]
 *
 * @author: w_jingbo
 * @date: 2023/9/15
 * @Copyright: 博客：http://coisini.wang
 */
public class SearchAndSort {


    public static void main(String[] args) {
        String[] A = {"i am a coder", "Coder Coder", "Code" , "cod"};
        int n = 4;
        List<String> result = find(A, n,"coder");
        System.out.println(result);
    }

    static class StringData{
        public String str ;
        public int count  ;
        public int index  ;

        public StringData(String str ,int count ,int index){
            this.str = str ;
            this.count = count ;
            this.index = index ;
        }
    }

    public static List<String> find(String[] strs , int n ,String tatget){
        List<String> res = new ArrayList<>();
        Map<Integer,StringData> conutMap = new HashMap<>();
        for (int i = 0; i < n; i++) {
            String s = strs[i].toLowerCase() ;
            int count = getCount(s,tatget) ;
            conutMap.put(i,new StringData(strs[i],count,i)) ;
        }
        List<StringData> sortdList = new ArrayList<>(conutMap.values()) ;
        Collections.sort(sortdList,(a,b) -> {
           if(a.count != b.count){
               return Integer.compare(b.count,a.count);
           }else {
               return Integer.compare(a.index,b.index);
           }
        });

        for (StringData stringData : sortdList) {
            if(stringData.count != 0){
                res.add(stringData.str);
            }
        }
        return res ;
    }

    public static int getCount(String str , String target){
        int count = 0 ;
        int index = 0;
        while ((index = str.indexOf(target, index)) != -1) {
            count++;
            index += target.length();
        }
        return count ;
    }
}
